/*
 * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software;Designed and Developed mainly by many Chinese
 * opensource volunteers. you can redistribute it and/or modify it under the
 * terms of the GNU General Public License version 2 only, as published by the
 * Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Any questions about this component can be directed to it's project Web address
 * https://code.google.com/p/opencloudb/.
 *
 */
package io.mycat.util;

import io.mycat.logTip.MycatLogger;
import io.mycat.logTip.MycatLoggerFactory;
import java.io.FileInputStream;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * @author mycat
 */
public class CharsetUtil {

  public static final MycatLogger LOGGER = MycatLoggerFactory
                                          .getLogger(CharsetUtil.class);
  private static final Map<Integer, String> INDEX_TO_CHARSET = new HashMap<>();
  private static final Map<String, Integer> CHARSET_TO_INDEX = new HashMap<>();

  public static void init(String root) {

    // index_to_charset.properties
    INDEX_TO_CHARSET.put(1, "big5");
    INDEX_TO_CHARSET.put(8, "latin1");
    INDEX_TO_CHARSET.put(9, "latin2");
    INDEX_TO_CHARSET.put(14, "cp1251");
    INDEX_TO_CHARSET.put(28, "gbk");
    INDEX_TO_CHARSET.put(24, "gb2312");
    INDEX_TO_CHARSET.put(33, "utf8");
    INDEX_TO_CHARSET.put(45, "utf8mb4");

    String filePath = Paths.get(root).resolve("index_to_charset.properties").toAbsolutePath()
                          .toString();
    Properties prop = new Properties();
    try {
      prop.load(new FileInputStream(filePath));
      for (Object index : prop.keySet()) {
        INDEX_TO_CHARSET.put(Integer.parseInt((String) index), prop.getProperty((String) index));
      }
    } catch (Exception e) {
      LOGGER.error("error:", e);
    }

    // charset --> index
    for (Integer key : INDEX_TO_CHARSET.keySet()) {
      String charset = INDEX_TO_CHARSET.get(key);
      if (charset != null && CHARSET_TO_INDEX.get(charset) == null) {
        CHARSET_TO_INDEX.put(charset, key);
      }
    }

    CHARSET_TO_INDEX.put("iso-8859-1", 14);
    CHARSET_TO_INDEX.put("iso_8859_1", 14);
    CHARSET_TO_INDEX.put("utf-8", 33);
  }

  public static final String getCharset(int index) {
    return INDEX_TO_CHARSET.get(index);
  }

  public static final int getIndex(String charset) {
    if (charset == null || charset.length() == 0) {
      return 0;
    } else {
      Integer i = CHARSET_TO_INDEX.get(charset.toLowerCase());
      return (i == null) ? 0 : i;
    }
  }


}
